/********************************************************************************

  MayaSoft Ingenieria Ltda

  Author       : $Author: cainlara@gmail.com $
  Last CheckIn : $Date: 2012-06-07 17:00:26 +0000 (Thu, 07 Jun 2012) $
  Revision     : $Revision: 57 $

*******************************************************************************/

package core;

import gui.dialogo.DialogoMensaje;

import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

import mensaje.Mensaje;

import utilidad.Util;

/**
 * Administra el acceso al log.
 * 
 * @author jose.lara 07.06.2012 
 */
public final class ManejadorLog {
    private static final Logger LOGGER          = Logger.getLogger(ManejadorLog.class.getName());
    private static final String PATRON_NOMBRE   = "TmManager-%u-%g.log"; 
    private static boolean iniciado             = false;
    private static FileHandler manejadorArchivo = null;
    
    private ManejadorLog() {
        //Imposible instanciar
    }
    
    private static void iniciarLog() {
        LOGGER.addHandler(crearManejadorArchivo());
        LOGGER.setLevel(Level.ALL);
        iniciado = true;
    }
    
    private static FileHandler crearManejadorArchivo() {
        String nombreArchivo = "";
        
        try {
            if(!Util.existeCarpetaConfiguracion()) {
                Util.crearCarpetaConfiguracion();
            }
            
            nombreArchivo += "%h";
            nombreArchivo += Util.SEPARADOR_ARCHIVO + Util.NOMBRE_CARPETA + Util.SEPARADOR_ARCHIVO;
            nombreArchivo += PATRON_NOMBRE;
            
            manejadorArchivo = new FileHandler(nombreArchivo, 1024 * 1024 * 10, 10, true);
            manejadorArchivo.setFormatter(new SimpleFormatter());
        }
        catch (SecurityException e) {
            DialogoMensaje.mostrarMensajeError(null, Mensaje.getMensaje("ERROR_INICIO-ARCHIVO_LOG"));
        } 
        catch (IOException e) {
            DialogoMensaje.mostrarMensajeError(null, Mensaje.getMensaje("ERROR_INICIO-ARCHIVO_LOG"));
        }
        
        return manejadorArchivo;
    }
    
    /**
     * Envía un error al log.
     * <P>
     * Este metodo escribe en el log un mensaje 
     * con el nivel mas alto de severidad.
     * 
     * @param e la excepcion lanzada.
     */
    public static void escribirErrorEnLog(Exception e) {
        escribirEnLog(Level.SEVERE, e);
    }
    
    /**
     * Envía un error al log.
     * <P>
     * Este metodo escribe en el log un mensaje 
     * de error con su respectiva traza.
     * 
     * @param mensaje el mensaje de error.
     * @param e la exception para obtener la traza.
     */
    public static void escribirErrorEnLog(String mensaje, Exception e) {
        StringBuilder builder   = null;
        String traza            = null;
        
        if(mensaje != null && mensaje.trim().length() > 0) {
            builder = new StringBuilder(mensaje);
        }
        
        if(e.getStackTrace() != null) {
            if(builder == null) {
                builder = new StringBuilder();
            }
            
            for(StackTraceElement elemento : e.getStackTrace()) {
                builder.append("\tat " + elemento);
            }
            
        }
        if(builder != null) {
            traza = builder.toString();
            escribirEnLog(Level.SEVERE, traza);
        }
    }
    
    /**
     * Envía un error al log.
     * <P>
     * Este metodo escribe en el log un mensaje 
     * con el nivel mas alto de severidad.
     * 
     * @param mensaje el mensaje de error.
     */
    public static void escribirErrorEnLog(String mensaje) {
        escribirEnLog(Level.SEVERE, mensaje);
    }
    
    /**
     * Envía un mensaje de informacion al log..
     * <P>
     * Este metodo escribe en el log un mensaje 
     * con el nivel de severidad <code>java.util.logging.Level.INFO</code>.
     * 
     * @see Level
     * @param mensaje el mensaje a escribir.
     */
    public static void escribirInfoEnLog(String mensaje) {
        escribirEnLog(Level.INFO, mensaje);
    }
    
    /**
     * Envia una excepcion al log.
     * <P>
     * Este metodo escribe en el log un mensaje 
     * con el nivel de severidad especificado.
     * 
     * @param e la excepcion lanzada.
     * @param nivel el nivel de severidad con 
     * el que se debe escribir.
     */
    public static void escribirEnLog(Level nivel, Exception e) {
        if(!iniciado) {
            iniciarLog();
        }
        
        LOGGER.log(nivel, e.getMessage(), e);
    }
    
    /**
     * Envia un mensaje al log.
     * <P>
     * Este metodo escribe en el log un mensaje 
     * con el nivel de severidad especificado.
     * 
     * @param mensaje el mensaje de error.
     * @param nivel el nivel de severidad con 
     * el que se debe escribir.
     */
    public static void escribirEnLog(Level nivel, String  mensaje) {
        if(!iniciado) {
            iniciarLog();
        }
        
        LOGGER.log(nivel, mensaje);
    }
}